package com.wh.serializable;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.MessageFormat;

public class TestObjSerializeAndDeserialize {

	public static void main(String[] args) {
/*		Person person = new Person();
		person.setAge(15);
		person.setName("aaaaa");
		person.setSex("man");
		serializableObject(person, new File("D:/person.txt"));*/
		Person person = deserializeObject(new File("D:/person.txt"));
		System.out.println(MessageFormat.format("name={0},age={1},sex={2}", person.getName(), person.getAge(), person.getSex()));
	}
	
	public static void serializableObject(Person person, File destFile) {
		ObjectOutputStream oo = null;
		try {
			oo = new ObjectOutputStream(new FileOutputStream(destFile));
			oo.writeObject(person);
			System.out.println("对象序列化成功");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				oo.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static Person deserializeObject(File destFile) {
		ObjectInputStream oi = null;
		try {
			oi = new ObjectInputStream(new FileInputStream(destFile));
			Person person = (Person) oi.readObject();
			System.out.println("对象反序列化成功");
			return person;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			if(oi != null) {
				try {
					oi.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}
}
/**
 * 
 * serialVersionUID的取值是Java运行时环境根据类的内部细节自动生成的。如果对类的源代码作了修改，再重新编译，新生成的类文件的serialVersionUID的取值有可能也会发生变化。
　　类的serialVersionUID的默认值完全依赖于Java编译器的实现，对于同一个类，用不同的Java编译器编译，有可能会导致不同的 serialVersionUID，也有可能相同。为了提高serialVersionUID的独立性和确定性，强烈建议在一个可序列化类中显示的定义serialVersionUID，为它赋予明确的值。

　　显式地定义serialVersionUID有两种用途：
　　　　1、 在某些场合，希望类的不同版本对序列化兼容，因此需要确保类的不同版本具有相同的serialVersionUID；
　　　　2、 在某些场合，不希望类的不同版本对序列化兼容，因此需要确保类的不同版本具有不同的serialVersionUID。
 */
